package com.fjbdxk.beidou.msg;

import com.fjbdxk.beidou.core.AbstractBeiDouMessage;
import com.fjbdxk.beidou.core.MsgFlagEnum;
import com.fjbdxk.beidou.core.MsgTypeEnum;
import lombok.Getter;
import lombok.Setter;

/**
 * @author huanggy
 * @version 1.0.0
 * @date 2024/05/13
 **/
@Getter
@Setter
public class BDFKIMessage extends AbstractBeiDouMessage {

    /**
     * 指令执行时间：UTC （东八区）时分秒
     */
    private int execTime;
    /**
     * 入站发射类型 : EPQ-应急搜救与定位报告；TCQ-报文通信申请；QRQ-查询功能；DTQ-定时申请;OFQ-开 关机报告；MSQ-静默申请；GBQ-建组申请。
     */
    private MsgTypeEnum applyType;
    /**
     * Y-发射成功；N-发射失败。
     */
    private String result;
    /**
     * 1-频率未到；2-发射抑制；3-发射静默；4- 功率未锁定；5-未检测到IC模块信息；6-权限不足。
     */
    private int failResult;

    /**
     * 距离下次发送时间，单位：秒
     */
    private int nextTime;

    @Override
    public String getType() {
        return MsgFlagEnum.BD.name() + MsgTypeEnum.FKI.name();
    }

    /**
     * 将多个相关字段的值组合成一个格式化的字符串，方便后续的处理或传输,生成传输格式
     * @return
     */
    @Override
    // 定义一个公共方法，返回类型为String，方法名为getData
    public String getData() {
        // 创建一个StringBuilder对象
        StringBuilder stringBuilder = new StringBuilder();
        // 将execTime添加到stringBuilder中，后面跟着一个SPLIT_CHAR
        stringBuilder.append(execTime).append(SPLIT_CHAR);
        // 将getApplyType()返回值添加到stringBuilder中，后面跟着一个SPLIT_CHAR
        stringBuilder.append(getApplyType()).append(SPLIT_CHAR);
        // 将getResult()返回值添加到stringBuilder中，后面跟着一个SPLIT_CHAR
        stringBuilder.append(getResult()).append(SPLIT_CHAR);
        // 将getFailResult()返回值添加到stringBuilder中，后面跟着一个SPLIT_CHAR
        stringBuilder.append(getFailResult()).append(SPLIT_CHAR);
        // 将getNextTime()返回值添加到stringBuilder中，后面跟着一个SPLIT_CHAR
        stringBuilder.append(getNextTime()).append(SPLIT_CHAR);
        // 将stringBuilder转换为String并返回
        return stringBuilder.toString();
    }


    /**
     * 从消息字符串进行实例化
     *将格式化的字符串消息解析为 BDFKIMessage 对象的各个属性，确保对象能够正确地表示来自消息的状态和信息
     * @param message
     * @return
     */
    // 定义一个公共方法，参数为message，返回类型为BDFKIMessage
    public BDFKIMessage from(String message) {
        // 如果message以BEGIN_CHAR + getType()开头
        if (message.startsWith(BEGIN_CHAR + getType())) {
            // 以SPLIT_CHAR为分隔符，将message分割成字符串数组
            String[] datas = message.split(SPLIT_CHAR);
            // 将datas[1]转换为Integer类型并赋给execTime
            this.execTime = Integer.valueOf(datas[1]);
            // 将datas[2]转换为MsgTypeEnum类型并赋给applyType
            this.applyType = MsgTypeEnum.valueOf(datas[2]);
            // 将datas[3]赋给result
            this.result = datas[3];
            // 将datas[4]转换为Integer类型并赋给failResult
            this.failResult = Integer.valueOf(datas[4]);
            // 从datas[5]中取子字符串，从索引0开始到CHECK_CODE_CHAR的位置，并将其转换为Integer类型赋给nextTime
            this.nextTime = Integer.valueOf(datas[5].substring(0, datas[5].indexOf(CHECK_CODE_CHAR)));
            // 返回当前对象
            return this;
        } else {
            // 如果message不符合条件，则返回null
            return null;
        }
    }

}
